﻿using System;
using System.Linq;
using System.Collections.Generic;
using SIM.Geo.DA;
using SIM.Geo.BE;
using System.Transactions;

namespace SIM.Geo.BL
{
    public class BLLitologia
    {
        /// <summary>
        /// Devuelve la lista de Litologias
        /// </summary>
        /// <returns></returns>
        public List<Litologia> ListarLitologia()
        {
            return Accesor.ListarLitologia();
        }

        /// <summary>
        /// Devuelve la lista de Litologias por Sondaje
        /// </summary>
        /// <returns></returns>
        public List<LitologiaResponse> BuscarLitologiaPorSondaje(int codigoSondaje)
        {
            return Accesor.BuscarLitologiaPorSondaje(codigoSondaje);
        }

        /// <summary>
        /// Registra nuevo Litologia
        /// </summary>
        /// <param name="Litologia"></param>
        /// <returns></returns>
        public string InsertarLitologia(Litologia litologia)
        {
            string result = "Registrado";

            int EsPermitidoLaDistancia = new DASondaje().ValidarDistanciaSondaje(litologia.CodigoSondaje, litologia.Hasta);
            if (EsPermitidoLaDistancia != 0)
            {
                result = "No se puede registrar. Está fuera de rango de la Distancia de Sondaje.";
                return result;
            }

            using (TransactionScope transaction = new TransactionScope())
            {
                //Primero elimina detalles
                litologia.CodigoLitologia = Accesor.GenerarCodigoLitologia(litologia.CodigoSondaje);

                Accesor.InsertarLitologia(litologia);
                transaction.Complete();
            }
            return result;
        }

        /// <summary>
        /// Modifica un Litologia
        /// </summary>
        /// <param name="Litologia"></param>
        public string ModificarLitologia(Litologia litologia)
        {
            string result = "Registrado";

            int EsPermitidoLaDistancia = new DASondaje().ValidarDistanciaSondaje(litologia.CodigoSondaje, litologia.Hasta);
            if (EsPermitidoLaDistancia != 0)
            {
                result = "No se puede registrar. Está fuera de rango de la Distancia de Sondaje.";
                return result;
            }

            using (TransactionScope transaction = new TransactionScope())
            {
                //Primero elimino los detalles

                DALitologiaAlteraciones dALitologiaAlteraciones = new DALitologiaAlteraciones();
                var listaAlteraciones = dALitologiaAlteraciones.ListarLitologiaAlteraciones(litologia.CodigoSondaje, litologia.CodigoLitologia);
                foreach (var item in listaAlteraciones)
                {
                    dALitologiaAlteraciones.EliminarLitologiaAlteraciones(item);
                }

                DALitologiaMinerales dALitologiaMinerales = new DALitologiaMinerales();
                var minerales = dALitologiaMinerales.ListarLitologiaMinerales(litologia.CodigoSondaje, litologia.CodigoLitologia);
                foreach (var item in minerales)
                {
                    dALitologiaMinerales.EliminarLitologiaMinerales(item);
                }

                Accesor.ModificarLitologia(litologia);
                transaction.Complete();
            }
            return result;
        }

        /// <summary>
        /// Eliminar un Litologia
        /// </summary>
        /// <param name="Litologia"></param>
        public void EliminarLitologia(int codigoSondaje, string codigoLitologia)
        {
            Accesor.EliminarLitologia(codigoSondaje, codigoLitologia);
        }

        /// <summary>
        /// Obtiene un Litologia
        /// </summary>
        /// <param name="codigoLitologia"></param>
        /// <returns></returns>
        public Litologia ObtenerLitologia(int codigoSondaje, string codigoLitologia)
        {
            return Accesor.ObtenerLitologia(codigoSondaje, codigoLitologia);
        }

        /// <summary>
        /// Devuelve la lista de Litologias por Sondaje, Invoca a un procedimiento almacenado
        /// </summary>
        /// <returns></returns>
        public List<buscarLitologia_Result> BuscarLitologiaPorSondaje1(int codigoSondaje)
        {
            return Accesor.BuscarLitologiaPorSondaje1(codigoSondaje);
        }

        /// <summary>
        /// Validar Interseccion
        /// </summary>
        /// <param name="codigoSondaje"></param>
        /// <param name="tipoAnalisis"></param>
        /// <param name="desde"></param>
        /// <param name="hasta"></param>
        /// <returns></returns>
        public int ValidarInterseccionLitologia(int codigoSondaje, string codigoLitologia, double desde, double hasta)
        {
            return Accesor.ValidarInterseccionLitologia(codigoSondaje, codigoLitologia, desde, hasta);
        }
        /// <summary>
        /// Devuelve la lista para ComboBox, DropdownList, devuelve campos Value y Text
        /// </summary>
        /// <returns></returns>
        public List<ListItemString> ObtenerListItem(int codigoSondaje)
        {
            var result = Accesor.ListarObservacionPorSondaje(codigoSondaje);
            return result.Select(x => new ListItemString { Value = x.CodigoLitologia, Text = x.Descripcion }).ToList();
        }

        /// <summary>
        /// Devuelve el ultimo Hasta
        /// </summary>
        /// <param name="codigoSondaje"></param>
        /// <returns></returns>
        public double ObtenerUltimoHasta(int codigoSondaje)
        {
            return Accesor.ObtenerUltimoHasta(codigoSondaje);
        }

        #region Accesor
        private static DALitologia Accesor
        {
            [System.Diagnostics.DebuggerStepThrough]
            get { return new DALitologia(); }
        }
        #endregion
    }
}
